table of contents
MALLOC(3) | Podręcznik programisty Linuksa | MALLOC(3) |
NAZWA¶
calloc, malloc, free, realloc - przydziela i zwalnia pamięć dynamiczną
SKŁADNIA¶
#include <stdlib.h> void *calloc(size_t nmemb, size_t size); void *malloc(size_t size); void free(void *ptr); void *realloc(void *ptr, size_t size);
OPIS¶
calloc() przydziela pamięć dla tablicy zawierającej nmemb elementów, każdy o rozmiarze size bajtów i zwraca wskaźnik do przydzielonej pamięci. Pamięć jest zerowana.
malloc() przydziela size bajtów i zwraca wskaźnik do przydzielonej pamięci. Pamięć nie jest czyszczona.
free() zwalnia obszar pamięci wskazywany przez ptr, który został wcześniej przydzielony za pomocą wywołania malloc(), calloc() lub realloc(). W przeciwnym przypadku, lub gdy free(ptr) zostało już wcześniej wywołane, funkcja zachowa się w sposób nieokreślony. Jeśli ptr jest równe NULL, nie zostanie wykonana żadna operacja.
realloc() zmienia rozmiar bloku pamięci wskazywanego przez ptr na size bajtów. Zawartość nie zostanie zmieniona w zakresie poniżej minimum ze starego i nowego rozmiaru; nowo przydzielona pamięć nie zostanie zainicjalizowana. Jeśli ptr jest równe NULL, to wywołanie jest równoważne malloc(size); jeśli size jest równe zeru, to wywołanie jest równoważne free(ptr). O ile ptr nie jest równe NULL, musi ono być zwrócone przez wcześniejsze wywołanie malloc(), calloc() lub realloc().
WARTOŚĆ ZWRACANA¶
Dla calloc() i malloc(), zwracana wartość jest wskaźnikiem do przydzielonej pamięci, który jest właściwie wyrównany dla dowolnego rodzaju zmiennej, lub NULL gdy żądanie zakończyło się niepowodzeniem.
free() nie zwraca żadnej wartości.
realloc() zwraca wskaźnik do nowoprzydzielonej pamięci, który jest właściwie wyrównany dla dowolnego rodzaju zmiennej i może być różny od ptr, lub NULL gdy żądanie zakończy się niepowodzeniem. Jeśli rozmiar był równy 0, zwracane jest NULL lub wskaźnik odpowiedni do przekazania go funkcji free(). Gdy realloc() zakończy się niepowodzeniem, pierwotny blok zostaje nienaruszony - nie jest on ani zwalniany ani przesuwany.
ZGODNE Z¶
ANSI-C
ZOBACZ TAKŻE¶
UWAGI¶
Standard Unix98 wymaga, by malloc(), calloc() i realloc() przy wystąpieniu błędu nadawały errno wartość ENOMEM. Glibc zakłada, że tak się dzieje (a wersje tych funkcji zawarte w glibc rzeczywiście to robią). Jeśli wykorzystuje się własną implementację malloc, która nie ustawia errno, to pewne funkcje biblioteczne mogą zawieść bez przekazania przyczyny w errno.
Załamania się w malloc(), free() czy realloc() są niemal zawsze związane z uszkodzeniami sterty, takimi jak przekroczenia rozmiaru przydzielonego fragmentu lub dwukrotne zwolnienie tego samego wskaźnika.
Nowe wersje linuksowej biblioteki libc (późniejsze niż 5.4.23) i GNU libc (2.x) zawierają implementację malloc, którą można dostrajać za pośrednictwem zmiennych środowiskowych. Przy ustawionej zmiennej MALLOC_CHECK_ stosowana jest specjalna (mniej wydajna) implementacja. Zgodnie z zamierzeniami, powinna być bardziej odporna na proste błędy, jak podwójne wywołania free() z tym samym argumentem czy przekroczenia o pojedynczy bajt (błędy off-by-one). Nie chroni jednak przed wszystkimi tego rodzaju błędami, w wyniku których mogą powstać wycieki pamięci. Jeśli MALLOC_CHECK_ ma wartość 0, jakiekolwiek wykryte uszkodzenie sterty zostanie milcząco zignorowane; jeśli ma wartość 1, na stderr wypisywany będzie komunikat diagnostyczny; jeśli ma wartość 2, to natychmiast zostanie wywołane abort(). Może się to przydać, gdyż w przeciwnym razie załamanie się mogłoby wystąpić dużo później, a prawdziwa przyczyna kłopotów byłaby wówczas bardzo trudna do wyśledzenia.
Linux stosuje optymistyczną strategię przydzielania pamięci. Oznacza to, że gdy malloc() zwraca wartość różną od NULL, nie ma gwarancji, iż pamięć faktycznie jest dostępna. Jeśli okaże się, że systemowi brakło pamięci, niesławny zabójca OOM zabije jeden lub więcej procesów.
1993-04-04 | GNU |